package com.example.designpatterns.templatemethod;

/**
 * 饮料制作模板类
 * 定义了制作饮料的算法骨架
 */
public abstract class BeverageTemplate {
    
    /**
     * 模板方法，定义了制作饮料的算法骨架
     * 声明为final防止子类重写
     */
    public final void prepareBeverage() {
        boilWater();
        brew();
        pourInCup();
        if (customerWantsCondiments()) {
            addCondiments();
        }
        System.out.println("饮料制作完成！");
    }
    
    /**
     * 烧水 - 具体步骤
     */
    private void boilWater() {
        System.out.println("将水煮沸");
    }
    
    /**
     * 倒入杯中 - 具体步骤
     */
    private void pourInCup() {
        System.out.println("将饮料倒入杯中");
    }
    
    /**
     * 冲泡 - 抽象方法，由子类实现
     */
    protected abstract void brew();
    
    /**
     * 添加调料 - 抽象方法，由子类实现
     */
    protected abstract void addCondiments();
    
    /**
     * 钩子方法，决定是否添加调料
     * 子类可以覆盖此方法以改变算法行为
     */
    protected boolean customerWantsCondiments() {
        return true;
    }
} 